﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MainScene;

namespace SSShell
{
    public class MLV
    {
        public ClassNode MainScene;
        private Taxonomia taxonomia;
        public string Fairytale = "";
        string Destroy = "Уничтожить";//Уточнить!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

        public MLV(ClassNode MScene,Taxonomia tax)
        {
            MainScene = MScene;
            taxonomia = tax;
        }

        //-----------------------генерация текста--------------------------------------------------------------------------
        public void GoRoundOfScene(string name)
        {
            /*int CurrentArc = 0;
            ClassNode CurrNode = MainScene.GetNodeByName(name);
            ClassNode nodenec;
            do
            {
                nodenec = CurrNode.LstNodes[CurrentArc];
                if (nodenec.TypeN == TypeNode.Scene)
                    GoRoundOfScene(nodenec.Name);
                else
                {
                    if (nodenec.CaseFrame.ToDo.Name == Destroy)
                        nodenec.CaseFrame.Recipient.IsDestroyed = true;
                    Fairytale += nodenec.GetText();
                }
                CurrentArc++;
            } while (CurrentArc < CurrNode.LstNodes.Count);*/
            ClassNode MainNode = MainScene.GetNodeByName(name);
            if (MainNode.TypeN == TypeNode.Action)
            {
                Fairytale += MainNode.GetText(taxonomia,0);
                return;
            }
            if (MainNode.LstNodes.Count == 0)
                return;//ошибка в СС
            ClassNode currNode = MainNode;
            currNode.ArriveFrom = null;
            currNode.LastParent = null;
            while (currNode.MaxBrowse != currNode.NumOfCurrentBrowse || currNode.LastParent != null ||
                currNode.ArriveFrom != currNode.LstNodes[currNode.LstNodes.Count - 1])//пока не обошли все ветви
            {
                if (currNode.TypeN == TypeNode.Action)//если действие
                {
                    Fairytale += currNode.GetText(taxonomia,0);
                    currNode.ArriveFrom.ArriveFrom = currNode;
                    currNode = currNode.ArriveFrom;//переход на сцену, откуда пришли
                }
                else //если сцена
                {
                    if (currNode.ArriveFrom == currNode.LastParent)//если только спустились
                    {
                        if (currNode.LstNodes.Count == 0)
                            return;//ошибка: сцена не ссылается на действия
                        currNode.NumOfCurrentBrowse = 0;//начинаем первый обход
                        currNode.LstNodes[0].ArriveFrom = currNode;
                        currNode.LstNodes[0].LastParent = currNode;
                        currNode = currNode.LstNodes[0];
                    }
                    else if (currNode.LstNodes.IndexOf(currNode.ArriveFrom) < currNode.LstNodes.Count - 1)//уже обошли часть потомков
                    {
                        currNode.LstNodes[currNode.LstNodes.IndexOf(currNode.ArriveFrom) + 1].ArriveFrom = currNode;
                        currNode.LstNodes[currNode.LstNodes.IndexOf(currNode.ArriveFrom) + 1].LastParent = currNode;
                        currNode = currNode.LstNodes[currNode.LstNodes.IndexOf(currNode.ArriveFrom) + 1];//выбираем следующего потомка
                    }
                    else if (currNode.LstNodes.IndexOf(currNode.ArriveFrom) == currNode.LstNodes.Count - 1)//обошли всех потомков
                    {//значит совершен обход сцены
                        currNode.NumOfCurrentBrowse++;
                        if (currNode.NumOfCurrentBrowse <= currNode.MaxBrowse)//если сцена повторяется, то снова ее обходим
                        {
                            currNode.LstNodes[0].ArriveFrom = currNode;
                            currNode.LstNodes[0].LastParent = currNode;
                            currNode = currNode.LstNodes[0];
                        }
                        else //поднимаемся на уровень вверх
                        {
                            if (currNode.LastParent != null)//не корневая вершина
                            {
                                currNode.LastParent.ArriveFrom = currNode;
                                currNode = currNode.LastParent;
                            }
                        }
                    }
                }
            }

        }
        //========================генерация текста==========================================================================
    }
}
